home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Workbench Add-On
/
Workbench Add-On - Volume 1.iso
/
Util
/
Time
/
CGCalendar
/
CGCal.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-08-13
|
12KB
|
410 lines
/*
** »»» CG Calendar v.03 (Preliminary) «««
**
** Written by Craig G. Callan August 1994
*/
#include <clib/intuition_protos.h>
#include <intuition/intuition.h>
#include <clib/exec_protos.h>
#include <graphics/text.h>
#include <graphics/gfx.h>
#include <exec/types.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
#define HEIGHT 15
#define WIDTH 40
#define WINHEIGHT 160
#define WINWIDTH 315
struct IntuitionBase *IntuitionBase;
struct Window *Window;
struct NewWindow NewWindow = {320 - (WINWIDTH + 100) / 2, 20,
WINWIDTH + 100, WINHEIGHT, 0, 1, CLOSEWINDOW |
INTUITICKS, WINDOWCLOSE | SMART_REFRESH |
ACTIVATE | WINDOWDRAG | WINDOWDEPTH |
NOCAREREFRESH, NULL, NULL,
"CG Calender v.03 (Preliminary)", NULL,
NULL, 440, 160, 440, 160, WBENCHSCREEN};
struct EasyStruct myES = {sizeof (struct EasyStruct), 0,
"CG Calendar Request",
"Do You Really Want to Quit?", "YES|NO"};
struct TextExtent ResultTextExtent;
struct tm *localTime;
time_t timeDate;
char buf [80], c, datestring[80], mname [12], monthname [13][12], Tim [9], weekname [8][10], wkname [10], yr [4];
long timx [3];
int day, julian, leapflg, month, wkday, wkdayfirst, year;
int monthlen [13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int CheckQ, ht, Number, reCheck, QFlag, wt;
void main (), BuildTimeString (), doIDCMP (), doScreen (), doText (), GetToday (), Refresh (), ShutDown (), StartUp ();
/*
»»» Start Of Main Program ««««««««««««««««««««««««««««««««««««««««««««««««««««
*/
void main()
{
CheckQ = 0; reCheck = 0; QFlag = 0;
StartUp ();
GetToday ();
julian = FindJulian (day, month, year);
doScreen ();
while (QFlag == 0)
{
doIDCMP ();
if (CheckQ == 1)
{
CheckQ = 0;
/*
»»» This part is for the "Do You Really Want to Quit?" requester «««
QFlag = EasyRequest (NULL, &myES, NULL, NULL, Number);
*/
QFlag = 1;
}
}
ShutDown ();
exit (TRUE);
}
/*
»»» All Subroutines/Functions Reside Below This Point ««««««««««««««««««««««««
*/
void BuildTimeString ()
{
USHORT Hours, Mins;
Hours = (USHORT) timx [1] / 60;
Tim [5] = ' '; Tim [7] = 'M'; Tim [8] = 0;
Mins = (USHORT) timx [1] - (60 * Hours);
if (Hours > 12)
{
Hours = Hours - 12;
Tim [6] = 'P';
}
else
Tim [6] = 'A';
Tim [0] = (Hours < 10) ? '0' : (Hours / 10) + '0';
Tim [1] = (Hours < 10) ? '0' + Hours : (Hours % 10) + '0';
if (Tim [2] == ':')
Tim [2] = ' ';
else
Tim [2] = ':';
Tim [3] = (Mins < 10) ? '0' : (Mins / 10) + '0';
Tim [4] = (Mins < 10) ? '0' + Mins : (Mins % 10) + '0';
}
int CheckForLeapYear (yr)
{
if ((yr % 4) == 0)
{ /* Check for leap year and alter February MONTHLEN */
monthlen [2] = 29;
return 1;
}
else
{
monthlen [2] = 28;
return 0;
}
}
void doIDCMP ()
{
struct IntuiMessage *message;
static USHORT ticks;
char Str [2];
int bDay, bMonth, bYear;
WaitPort (Window -> UserPort);
while (message = (struct IntuiMessage *) GetMsg (Window -> UserPort))
{
switch (message -> Class)
{
case CLOSEWINDOW:
CheckQ = 1;
break;
case INTUITICKS:
if (ticks++ > 7)
{
ticks = 0;
DateStamp (timx);
BuildTimeString (timx);
doText (310, WINWIDTH + 86, 62 + ht, Tim, 1);
reCheck++;
if (reCheck > 1) /* Recheck date every second */
{
reCheck = 0;
bDay = day; bMonth = month; bYear = year;
GetToday ();
julian = FindJulian (day, month, year);
if (day != bDay || month != bMonth || year != bYear)
Refresh ();
}
}
break;
}
ReplyMsg (message);
}
}
void doScreen ()
{
char Day [4], buf [40];
int c1, c2, d, i, j, w, x, y;
/*
»»» Draw the "Info" part of the window «««
*/
doText (310, WINWIDTH + 86, 58 - ht + (ht / 2), "Information", 2);
SetAPen (Window -> RPort, 1);
Move (Window -> RPort, 310, 58 + (HEIGHT * 6) + 6);
Draw (Window -> RPort, 310, 58);
Draw (Window -> RPort, WINWIDTH + 86, 58);
SetAPen (Window -> RPort, 2);
Draw (Window -> RPort, WINWIDTH + 86, 58 + (HEIGHT * 6) + 6);
Draw (Window -> RPort, 310, 58 + (HEIGHT * 6) + 6);
Move (Window -> RPort, (WINWIDTH + 86 + 310) / 2 - (wt / 2), 58 - ht + (ht / 2));
doText (310, WINWIDTH + 86, 62 + ht, "--:-- --", 1);
strcopy (buf, "Julian ");
for (i = 0; i < 4; i++)
Day [i] = 0;
itoa (julian, Day);
strcat (buf, Day);
doText (310, WINWIDTH + 86, 58 + (ht * 4), buf, 1);
if (leapflg == 1)
doText (310, WINWIDTH + 86, 62 + (ht * 5), "Leap Year", 1);
/*
»»» Draw Calendar «««
*/
d = 1; y = 58;
buf [0] = 0;
strcat (buf, monthname [month]); strcat (buf, " "); strcat (buf, yr);
doText (0, WINWIDTH, 30, buf, 2);
w = wt / i;
SetAPen (Window -> RPort, 1);
Day [0] = 0; Day [1] = 0; Day [2] = 0;
for (i = 1; i < 8; i++)
{
x = 9 + (i * (WIDTH + 2)) - WIDTH - 2;
strcopy (buf, weekname [i]); buf [3] = 0;
doText (x, x + WIDTH, y - ht + (ht / 2), buf, 1);
}
do
{
if (d == 1)
j = wkdayfirst;
else
j = 1;
while (j < 8 && d < monthlen [month] + 1)
{
x = 10 + (j * (WIDTH + 2)) - WIDTH - 2;
Move (Window -> RPort, x, y + HEIGHT);
if (d == day)
{
c1 = 2; c2 = 1;
}
else
{
c1 = 1; c2 = 2;
}
SetAPen (Window -> RPort, c2);
Draw (Window -> RPort, x, y);
Draw (Window -> RPort, x + WIDTH, y);
SetAPen (Window -> RPort, c1);
Draw (Window -> RPort, x + WIDTH, y + HEIGHT);
Draw (Window -> RPort, x, y + HEIGHT);
SetAPen (Window -> RPort, 1);
itoa (d, Day);
Move (Window -> RPort, x + (w / (w / 2)) , y + ht);
if (d < 10)
Text (Window -> RPort, Day, 1);
else
Text (Window -> RPort, Day, 2);
d++; j++; x = x + WIDTH + 2;
}
y = y + HEIGHT + 1;
} while (d < monthlen [month] + 1);
}
void doText (wx1, wx2, y, str, color)
char str [80];
int color, wx1, wx2, y;
{
int x;
TextExtent (Window -> RPort, str, strlen (str), &ResultTextExtent);
ht = ResultTextExtent.te_Height;
if (ht > HEIGHT - 2)
{
ShutDown ();
printf ("\nError! Please use a font that is smaller than %d points...\n\n", HEIGHT - 1);
exit (FALSE);
}
wt = ResultTextExtent.te_Width;
x = ((wx2 + wx1) / 2) - (wt / 2);
SetAPen (Window -> RPort, color);
Move (Window -> RPort, x, y);
Text (Window -> RPort, str, strlen (str));
}
int FindJulian (dy, mnth, year)
{
int jul, i;
leapflg = CheckForLeapYear (year);
jul = dy;
for (i = 1; i < mnth; i++)
jul = jul + monthlen [i];
return jul;
}
void GetToday ()
{
int i, j;
timeDate = time (NULL);
localTime = localtime (&timeDate);
strftime (datestring, (size_t)80, "\"%A, %d %B %Y\"\n", localTime );
i = 0;
while (datestring [i] != 'y' && datestring [i] != 0)
{
wkname [i] = datestring [i + 1];
i++;
wkname [i] = 0;
}
wkday = 0;
for (j = 1; j < 8; j++)
if (strcmp (weekname [j], wkname) == 0) wkday = j;
i = i + 3; j = 0;
while (datestring [i] != ' ' && datestring [i] != 0)
{
buf [j] = datestring [i];
i++; j++;
buf [j] = 0;
}
day = atoi (buf);
i++; j = 0;
while (datestring [i] != ' ' && datestring [i] != 0)
{
mname [j] = datestring [i];
i++; j++;
mname [j] = 0;
}
month = 0;
for (j = 1; j < 13; j++)
if (strcmp (monthname [j], mname) == 0) month = j;
i++; j = 0;
while (j < 4)
{
yr [j] = datestring [i];
i++; j++;
yr [j] = 0;
}
year = atoi (yr);
i = day; wkdayfirst = wkday;
while (i > 1)
{
i--; wkdayfirst--;
if (wkdayfirst < 1) wkdayfirst = 7;
}
leapflg = CheckForLeapYear (year);
}
itoa (n, s) register int n;
register char *s;
{
int i, forechar;
i = forechar = 0;
if (n < 0)
{
forechar = 1;
n = -n;
}
do
{
s [i++] = n % 10 + '0';
} while ((n /= 10) > 0);
if (forechar)
s [i++] = '-';
reverse (s);
}
void Refresh ()
{
SetAPen (Window -> RPort, 0);
RectFill (Window -> RPort, 4, ht * 3, WINWIDTH + 88, WINHEIGHT - 4);
doScreen ();
}
reverse (s) register char *s;
{
register int c, i, j;
for (i = 0, j = strlen (s) - 1; i < j; i++, j--)
{
c = s [i];
s [i] = s [j];
s [j] = c;
}
}
void ShutDown ()
{
if (Window) CloseWindow (Window);
if (IntuitionBase) CloseLibrary (IntuitionBase);
}
void StartUp ()
{
int i, j;
char buf [4];
IntuitionBase = (struct IntuitionBase *) OpenLibrary ("intuition.library", 37);
if (IntuitionBase == NULL)
{
printf (" You must have Kickstart v37 or newer, aborting...\n");
exit (FALSE);
}
if ((Window = (struct Window *) OpenWindow (&NewWindow)) == NULL)
{
CloseLibrary (IntuitionBase);
exit (FALSE);
}
TextExtent (Window -> RPort, "Test", 4, &ResultTextExtent);
ht = ResultTextExtent.te_Height;
if (ht > HEIGHT - 2)
{
ShutDown ();
printf ("\nError! Please use a font that is smaller than %d points...\n\n", HEIGHT - 2);
exit (FALSE);
}
strcopy (weekname [1], "Sunday"); strcopy (weekname [2], "Monday");
strcopy (weekname [3], "Tuesday"); strcopy (weekname [4], "Wednesday");
strcopy (weekname [5], "Thursday"); strcopy (weekname [6], "Friday");
strcopy (weekname [7], "Saturday");
strcopy (monthname [1], "January"); strcopy (monthname [2], "February");
strcopy (monthname [3], "March"); strcopy (monthname [4], "April");
strcopy (monthname [5], "May"); strcopy (monthname [6], "June");
strcopy (monthname [7], "July"); strcopy (monthname [8], "August");
strcopy (monthname [9], "September"); strcopy (monthname [10], "October");
strcopy (monthname [11], "November"); strcopy (monthname [12], "December");
}
strcopy (t, s) register char *t, *s;
{
while (*t++ = *s++);
}